package com.hrm.action;

import com.hrm.action.annotation.ResponsePath;
import com.hrm.dto.Envelope;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Create by zekdot on 20-2-25.
 */
@WebServlet("/")
public class BaseAction extends HttpServlet {
    // 所有的地址-对象映射 第一个元素放类或方法主体，后面的元素方法子映射或者参数列表
    public static Map<String,Object> urls = new HashMap<>();
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
        req.setCharacterEncoding("utf-8");
        // 获取地址的各部分
        String reqUrls[] = req.getRequestURI().split("/");
        // 获取切割总长度
        int length = reqUrls.length;
        // 获取一级地址列表
        List list = (List) urls.get("/"+reqUrls[length-2]);
        // 如果无法处理请求
        if(list == null){
            return;
        }
        // 获取一级地址的Action对象
        Object action = list.get(0);
        // 获取方法字典
        Map<String,Object> map = (Map<String, Object>) list.get(1);
        // 获取二级地址列表
        list = (List) map.get("/"+reqUrls[length-1]);

        // 获取处理方法
        Method method = (Method) list.get(0);
        // 方法参数列表
        Object[] params = new Object[list.size()-1];
        // 处理方法的所有参数
        for(int i=1;i<list.size();i++){
            // 获取参数
            Parameter parameter = (Parameter) list.get(i);
//            System.out.println(parameter);
            // 如果是session类型的参数
            if(parameter.getType().equals(HttpSession.class)){
                // 需要从request中去获取
                params[i-1] = req.getSession();
            }else{
                // 获取前端传来的实际参数
                String res = req.getParameter(parameter.getName());
                // 如果参数是int类型
                if(parameter.getType().equals(int.class)){
                    params[i-1] = Integer.parseInt(res);
                }else if(parameter.getType().equals(double.class)) {
                    // 如果参数是double类型
                    params[i-1] = Double.parseDouble(res);
                }else{
                    // 放置参数
                    params[i-1] = parameter.getType().cast(res);
                }

            }

        }
        Object res = null;
        try {
            res = method.invoke(action,params);
        } catch (Exception e) {
            e.printStackTrace();
            res = new Envelope(-2,"action层方法错误",null).toString();
        }

        // 看方法上有没有转移jsp标签
        ResponsePath responsePath = method.getAnnotation(ResponsePath.class);
        // 没有说明直接返回字符串
        if(responsePath == null){
            // 设置响应编码
            resp.setHeader("content-type", "text/html;charset=UTF-8");
            resp.setCharacterEncoding("utf-8");
            // 打印结果
            resp.getWriter().println(res.toString());
        }else{
            // 获取jsp的路径
            String path = responsePath.path();
            // 给请求放上处理完的结果
            req.setAttribute("param",res);
            // 发送请求到jsp上
            req.getRequestDispatcher("/WEB-INF/page" + path + ".jsp").forward(req,resp);
        }


//        System.out.println("Hello zekdot");
    }
}
